iT邦幫忙

2025 iThome 鐵人賽

DAY 3
2

歷時了這麼久的同步,特務 K 心中的問題像以太坊的區塊那麼多。他決定先從一個簡單的開始問。

「你的節點,一開始怎麼知道去哪裡下載資料?他們的線人是誰?他們怎麼知道可以相信他們?」

這是三個問題,或是更多。

「的確,以太坊的設計是想要盡量減少需要信任的來源,而每樣被採信的資訊都能被驗證過」小雨說。

「然而,現實世界總有那麼一兩處最根源的地方,會需要從信任的來源取得資訊。」

引門人

種子節點(Boot nodes) 就是這樣的地方,這是一組和客戶端程式碼一起發佈的節點 IP 位置,以及他們的數位簽章公鑰資訊」

IP 位置讓我的節點可以在茫茫網海中找到對方,有公鑰資訊可以讓兩個節點間做密鑰交換,方便後面的通信安全。「合理」,特務 K 心想。

特務 K 喚起了他的 VScode,在 Go-Ethereum 的 程式碼中 這些種子節點寫死在程式碼裡面。負責出資研究、開發、與維護以太坊的機構之一: 以太坊基金會(Ethereum Foundation),同時也維護了幾個種子節點。

// MainnetBootnodes are the enode URLs of the P2P bootstrap nodes running on
// the main Ethereum network.
var MainnetBootnodes = []string{
	// Ethereum Foundation Go Bootnodes
	"enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", // bootnode-aws-ap-southeast-1-001
	"enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303",   // bootnode-aws-us-east-1-001
	"enode://2b252ab6a1d0f971d9722cb839a42cb81db019ba44c08754628ab4a823487071b5695317c8ccd085219c3a03af063495b2f1da8d18218da2d6a82981b45e6ffc@65.108.70.101:30303", // bootnode-hetzner-hel
	"enode://4aeb4ab6c14b23e2c4cfdce879c04b0748a20d8e9b59e25ded2a08143e265c6c25936e74cbc8e641e3312ca288673d91f2f93f8e277de3cfa444ecdaaf982052@157.90.35.166:30303", // bootnode-hetzner-fsn
}

特務 K 看著代表種子節點的字串:enode 後面接著一連串的十六進位碼 -- 是為節點識別符 -- 最後接著 IP 地址與埠。 後方的註解暗示種子節點部署分別在某美國和某德國雲端服務提供者那邊。

「你說的公鑰資訊在哪個部分呢?」特務 K 問。

「節點的識別符就是 從公鑰導出」小雨回道。

特務 K 接著又看 Lighthouse 的程式碼,並找到了 記載種子節點的地方

# Eth mainnet consensus layer bootnodes
# ---------------------------------------
# 1. Tag nodes with maintainer
# 2. Keep nodes updated
# 3. Review PRs: check ENR duplicates, fork-digest, connection.

# Teku team's bootnodes
- enr:-Iu4QLm7bZGdAt9NSeJG0cEnJohWcQTQaI9wFLu3Q7eHIDfrI4cwtzvEW3F3VbG9XdFXlrHyFGeXPn9snTCQJ9bnMRABgmlkgnY0gmlwhAOTJQCJc2VjcDI1NmsxoQIZdZD6tDYpkpEfVo5bgiU8MGRjhcOmHGD2nErK0UKRrIN0Y3CCIyiDdWRwgiMo # 3.147.37.0 | aws-us-east-2-ohio
- enr:-Iu4QEDJ4Wa_UQNbK8Ay1hFEkXvd8psolVK6OhfTL9irqz3nbXxxWyKwEplPfkju4zduVQj6mMhUCm9R2Lc4YM5jPcIBgmlkgnY0gmlwhANrfESJc2VjcDI1NmsxoQJCYz2-nsqFpeEj6eov9HSi9QssIVIVNr0I89J1vXM9foN0Y3CCIyiDdWRwgiMo # 3.107.124.68  | aws-ap-southeast-2-sydney

共識層客戶端有另外自己的點對點網路。 Lighthouse 記載節點的方式不太一樣,用了一種稱為 ENR 標準的編碼方式。特務 K 用小雨提供的 ENR 解碼網站,看到了公鑰、IP 地址、埠等資訊。

「這是我個人的觀察和意見,但還找不到公開紀錄佐證:之所以拆兩個客戶端、拆兩個 P2P 網路、兩個網路用不太一樣的網路層標準,比較不是技術決策上的因素,而更是管理的因素。」小雨說「共識層與執行層有非常不一樣的專業和創新節奏:前者的發展比較晚進,後者因為需要維護既有區塊鏈的應用的穩定,因此較新的標準和做法會放在共識層上。」

介紹朋友

「連上了種子節點之後呢?難道一萬多個節點都是連著那幾個種子節點?」特務 K 換個話題。

「當然不是囉!種子節點只是用來幫你介紹朋友的」小雨說。「你的節點需要找到自己的朋友,這個過程叫做 節點發掘(Discovery)

「節點們也有遠近親疏,交朋友的規則是只能和最近的朋友交往」小雨補充。

「怎麼定義遠近呢?他們有 GPS 嗎?」特務 K 問。

「識別符最酷的地方是他也定義了遠近的部分」小雨補充「兩個的識別符互相做個互斥或(XOR)之後就會得到一種數字上的『距離』」

「這個距離不是地理上的距離」小雨再補充「假設台北、高雄、柏林各有一個節點,雖然 台北-柏林 的地理距離比 台北-高雄 遠,但有可能前者識別符的數字距離比較近」

整個發掘的過程是:先從種子節點問到一些朋友,再從他們問到朋友的朋友,再從朋友的朋友再問,以此反覆。最後維持 50 ~ 100 個 最近的朋友。

特務 K 本來盤算著針對連線最多的節點攻擊,來癱瘓網路。但似乎在節點發掘的機制之下,朋友會被均勻的分配給其他朋友,導致沒有節點看起來特別重要。

「如果種子節點全部下線會怎麼辦?」特務 K 尋思。

「根據我看到的討論,這目前只會影響新節點無法加入,但舊節點與既有的網路就沒事」小雨說。「在沒有種子節點的情況下,客戶端也有手動新增節點地址的選項。」

總結

特務 K 深吸一口氣,試著消化和小雨的這段對話。

「看起來,節點同步的起點始於和少數的種子節點溝通,種子會介紹其他朋友節點,朋友會再介紹其他朋友,最後維持適量的朋友,形成均勻的網路」特務 K 總結。「這些朋友裡面沒有特別哪一位負責發號施令,或是被倚賴得太多,以至於失去他會對網路造成嚴重傷害。」

「沒錯,整個以太坊的腳就是點對點網路,有些人稱之為 網路層(Networking Layer) 」小雨說「一旦朋友的網路都建立好了,節點就透過 八卦(Gossip) 的方式,朋友告訴朋友,把一些訊息廣播到網路上。」

小雨留下了一些參考資訊


上一篇
變成電腦的一部分
下一篇
今年十歲的電腦
系列文
那個有好多好多節點的電腦調查報告8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言